﻿// 904 最长公共前缀问题.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory.h>
#include <string.h>

using namespace std;
/*
http://oj.daimayuan.top/course/7/problem/540
给你 n个字符串 s1,s2,...,sn和 m
 组询问，每次询问读入两个数 x,y
，请求出 sx和 sy的最长公共前缀的长度。

两个字符串 a,b的最长公共前缀是指：找到最大的整数 k
 (k≥0)，满足 a和 b的前 k个位置的字符完全一样，
 a和 b的前 k个位置的字符组成的子串就是 a,b的最长公共前缀。

输入格式
第一行一个整数 n，代表字符串个数。

接下来 n行，每行一个字符串 si。

接下来一行一个整数 m，代表询问组数。

接下来 m行，每行两个整数 x,y，代表一组询问。

输出格式
输出共 m行，每行一个整数表示一组询问的答案。

样例输入
4
abcd
cdf
abc
bbc
2
1 3
2 4
样例输出
3
0
数据规模
对于所有数据，保证 1≤n,m≤50000,1≤x,y≤n,x≠y,1≤|si|≤10000,1≤∑|si|≤500000
，字符串均由小写字母构成。
*/

int n, m, nxt[500001][26], cnt = 0, father[500001][21], idx[50001],d[500001];
char str[10011];





int main()
{
	scanf("%d",&n);
	for (int i = 1; i <= n; i++) {
		scanf("%s",str);
		int len = strlen(str);
		int now = 0;
		for (int j = 0; j < len; j++) {
			int x = str[j] - 'a';
			if (!nxt[now][x]) {
				nxt[now][x] = ++cnt;
				father[cnt][0] = now;
				d[cnt] = d[now] + 1;
			}
			now = nxt[now][x];
		}
		idx[i] = now;
	}

	for (int i = 1; i <= 20; ++i)
		for (int j = 1; j <= cnt; j++)
			if (father[j][i - 1])
				father[j][i] = father[father[j][i - 1]][i - 1];

	scanf("%d",&m);
	for (int i = 1; i <= m; i++) {
		int x, y;
		scanf("%d%d",&x,&y);
		x = idx[x]; y = idx[y];
		if (d[x] < d[y])
			swap(x, y);
		int z = d[x] - d[y];
		 
		for (int j = 0; j < 20 && z; j++, z /= 2) {
			if (z & 1)
				x = father[x][j];
		}
		if (x == y) {
			printf("%d\n",d[x]);
			continue;
		}

		for (int j = 20; j >= 0; --j) {
			if (father[x][j] != father[y][j])
				x = father[x][j], y = father[y][j];
		}
		printf("%d\n",d[father[x][0]]);
	}

	return 0;
}

 